package edu.pe.cayetano.model.bo;

import org.apache.commons.beanutils.DynaBean;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.dao.DiagnosticoDefinitivoDAO;
import edu.pe.cayetano.dao.HistoriaClinicaDAO;
import edu.pe.cayetano.dao.OperacionesComunesDAO;
import edu.pe.cayetano.dao.PacienteDAO;
import edu.pe.cayetano.framework.BusinessException;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;
import edu.pe.cayetano.util.UtilTime;
import edu.pe.cayetano.util.Utilitario;
import edu.pe.cayetano.util.UtilitarioSQLQuery;

public class HistoriaClinicaBO  extends BaseBO{
	
	public StringBuffer estableceQuery(DynaBean dyna){
		
		StringBuffer 	query 		= new StringBuffer();
		String 			campo		= Utilitario.getPropertyDynaBean(dyna, "optCampo");
		String 			criterio	= Utilitario.getPropertyDynaBean(dyna, "criterio");
		String 			operacion	= Utilitario.getPropertyDynaBean(dyna, "operacion");
		
		if(ConstantesSECCD.OPERACION_BUSQUEDA.equalsIgnoreCase(operacion)&&operacion!=null){
			if(ConstantesSECCD.CRITERIO_TODOS.equalsIgnoreCase(campo)&&campo!=null){
				query=UtilitarioSQLQuery.devuelveQueryListadoHC();
				query.append(" ORDER BY FECHA_CREACION DESC");
			}
			else{
				query=UtilitarioSQLQuery.devuelveQueryListadoHC();
				query.append(" WHERE  UPPER("+campo+") LIKE '%"+criterio.toUpperCase()+"%'");
				query.append(" ORDER BY FECHA_CREACION DESC");
			}
		}
		if(ConstantesSECCD.OPERACION_LISTADO.equalsIgnoreCase(operacion)&&operacion!=null){
			query=UtilitarioSQLQuery.devuelveQueryListadoHC();
		}
		if(ConstantesSECCD.OPERACION_BUSQUEDA_ESPECIFICA.equalsIgnoreCase(operacion)){
			query=UtilitarioSQLQuery.devuelveQueryListadoHC();
			query.append(" WHERE UPPER("+campo+") LIKE '%"+criterio.toUpperCase()+"%'");
			query.append(" ORDER BY FECHA_CREACION DESC");
		}
		System.out.println("HistoriaClinicaBO>>query en estableceQuery 1:"+query.toString());
		return query;
	}
	
	public StringBuffer estableceQueryArchivo(DynaBean dyna,String codUsuario){
		
		StringBuffer 	query 		= new StringBuffer();
		String 			campo		= Utilitario.getPropertyDynaBean(dyna, "optCampo");
		String 			criterio	= Utilitario.getPropertyDynaBean(dyna, "criterio");
		String 			operacion	= Utilitario.getPropertyDynaBean(dyna, "operacion");
		
		if(ConstantesSECCD.OPERACION_BUSQUEDA.equalsIgnoreCase(operacion)&&operacion!=null){
			if(ConstantesSECCD.CRITERIO_TODOS.equalsIgnoreCase(campo)&&campo!=null){
				query=UtilitarioSQLQuery.devuelveQueryListadoArchivo(codUsuario);
				query.append(" ORDER BY FILEHC DESC");
			}
			else{
				query=UtilitarioSQLQuery.devuelveQueryListadoArchivo(codUsuario);
				query.append(" AND  UPPER("+campo+") LIKE '%"+criterio.toUpperCase()+"%'");
				query.append(" ORDER BY FILEHC DESC");
			}
		}
		if(ConstantesSECCD.OPERACION_LISTADO.equalsIgnoreCase(operacion)&&operacion!=null){
			query=UtilitarioSQLQuery.devuelveQueryListadoArchivo(codUsuario);
		}
		if(ConstantesSECCD.OPERACION_BUSQUEDA_ESPECIFICA.equalsIgnoreCase(operacion)){
			query=UtilitarioSQLQuery.devuelveQueryListadoArchivo(codUsuario);
			query.append(" AND UPPER("+campo+") LIKE '%"+criterio.toUpperCase()+"%'");
			query.append(" ORDER BY FILEHC DESC");
		}
		System.out.println("HistoriaClinicaBO>>query en estableceQueryArchivo :"+query.toString());
		return query;
	}
	public BResult listarHistoriaClinica() throws BusinessException{
		BResult 				retSalida		= null;
		try{
			conectar();
			OperacionesComunesDAO operacionesDAO	 	= new OperacionesComunesDAO(conn);
			DynaBean 		dyna = Utilitario.seteaDynaBeanListadoTabla(null,null,null);
			StringBuffer	query = estableceQuery(dyna);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo listarHistoriaClinica generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo listarHistoriaClinica generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	/**
	 * Metodo que busca una historia clinica
	 * */
	public BResult buscarHistoriaClinica(DynaBean dyna) throws BusinessException{
		BResult 				retSalida		= null;
		try{
			conectar();
			OperacionesComunesDAO	operacionesDAO	 	= new OperacionesComunesDAO(conn);
			StringBuffer query = estableceQuery(dyna);
			retSalida 	= operacionesDAO.listado(query);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarHistoriaClinica generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarHistoriaClinica generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	/**
	 * Metodo que busca el archivo de una historia clinica
	 * */
	public BResult buscarArchivoHistoriaClinica(DynaBean dyna,String codUsuario) throws BusinessException{
		BResult 				retSalida		= null;
		try{
			conectar();
			OperacionesComunesDAO	operacionesDAO	 	= new OperacionesComunesDAO(conn);
			StringBuffer query = estableceQueryArchivo(dyna,codUsuario);
			String nrohc =  Utilitario.getPropertyDynaBean(dyna, "txtHC");
			retSalida 	= operacionesDAO.listadoxParam(query,nrohc);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarArchivoHistoriaClinica generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarArchivoHistoriaClinica generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult insertaHistoriaClinica(DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= null;
		try{
			conectar();
			HistoriaClinicaDAO 		historiaDAO	 		= new HistoriaClinicaDAO(conn);
			String codigoHC = generaCodigoHC();
			dyna.set("codigo", codigoHC);
			BResult retHC 	= historiaDAO.insertaHistoriaClinica(dyna);
			if(retHC.getCode()==0){
				String	codigoArchivoHC = generaCodigoHCDetalle(codigoHC);
				BResult retHCD 			= historiaDAO.insertaHistoriaClinicaDetalle(dyna,ConstantesSECCD.INSERTA_HC_DETALLE,codigoArchivoHC);
				if(retHCD.getCode()==0){
					PacienteDAO pacienteDAO	 	= new PacienteDAO(conn);
					BResult		retHCP = pacienteDAO.asignaHCxPaciente(dyna);
					if(retHCP.getCode()==0){
						retSalida = new BResult();
						retSalida.setCode(ConstantesSECCD.EXITO_RET);
						grabar();
					}else{
						try {
							deshacer();
						} catch (Exception e3) {
						}
					}
				}else{
					try {
						deshacer();
					} catch (Exception e2) {
					}
				}
				}
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo insertaHistoriaClinica generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo insertaHistoriaClinica generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult editaHistoriaClinica(DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= null;
		try{
			conectar();
			HistoriaClinicaDAO 		historiaDAO	 		= new HistoriaClinicaDAO(conn);
			retSalida 	= historiaDAO.editaArchivoHC(dyna);
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo insertaHistoriaClinica generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo insertaHistoriaClinica generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	
	public BResult listarHCFiles(DynaBean dyna,String codUsuario) throws BusinessException{
		BResult 				retSalida		= null;
		try{
			conectar();
			OperacionesComunesDAO	operacionesDAO	 	= new OperacionesComunesDAO(conn);
			String codigo=Utilitario.getPropertyDynaBean(dyna,"codigo");
			StringBuffer query = estableceQueryArchivo(dyna,codUsuario);
			retSalida 	= operacionesDAO.listadoxParam(query,codigo);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo listarHCFiles generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo listarHCFiles generado por:"+e.getMessage());
			}
		}
		return retSalida;
	}

	public BResult insertaArchivoHC(DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= null;
		try{
			conectar();
			HistoriaClinicaDAO historiaDAO	 		= new HistoriaClinicaDAO(conn);
			String	codigoArchivoHC = generaCodigoHCDetalle(Utilitario.getPropertyDynaBean(dyna,"txtHC"));
			BResult retHCD 	= historiaDAO.insertaHistoriaClinicaDetalle(dyna,ConstantesSECCD.INSERTA_HC_DETALLE_FILE,codigoArchivoHC);
			if(retHCD.getCode()==0){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.EXITO_RET);
				grabar();
			}else{
				try {
					deshacer();
				} catch (Exception e2) {
				}
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
			}
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo insertaArchivoHC generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo insertaArchivoHC generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult editaArchivoHC(DynaBean dyna) throws BusinessException{
		BResult 				retSalida				= null;
		try{
			conectar();
			HistoriaClinicaDAO historiaDAO	 		= new HistoriaClinicaDAO(conn);
			BResult retHCD 	= historiaDAO.editaArchivoHC(dyna);
			if(retHCD.getCode()==0){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.EXITO_RET);
				grabar();
			}else{
				try {
					deshacer();
				} catch (Exception e2) {
				}
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
			}
		}catch(Exception e){
			try {
				deshacer();
			} catch (Exception e2) {
				throw new BusinessException(e.getMessage(), e2);
			}
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo editaArchivoHC generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo editaArchivoHC generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult buscarArchivoHCEspecifico(DynaBean dyna) throws BusinessException{
		BResult 					retSalida			= null;
		try{
			conectar();
			HistoriaClinicaDAO	historiaDAO	= new HistoriaClinicaDAO(conn);
			retSalida 			= historiaDAO.buscarArchivoHCEspecifico(dyna);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarArchivoHCEspecifico generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarArchivoHCEspecifico generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}

	public BResult buscaEstadoUltimoArchivo(DynaBean dyna) throws BusinessException{
		BResult 					retSalida			= null;
		try{
			conectar();
			HistoriaClinicaDAO	historiaDAO	= new HistoriaClinicaDAO(conn);
			retSalida 			= historiaDAO.buscaEstadoUltimoArchivo(dyna);
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscaEstadoUltimoArchivo generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscaEstadoUltimoArchivo generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	/**
	 * Metodo que genera el codigo para una historia clinica
	 * */	
	public String generaCodigoHC(){
		int cantidadHC = 0;
		try {
			OperacionesComunesDAO 	operacionesDAO	 	= new OperacionesComunesDAO(conn);
			cantidadHC = operacionesDAO.obtenerCodigoInsercionAnualizada("HISTORIA_CLINICA");
		} catch (Exception e) {
		}
		return Utilitario.generaCodigoInsercion(UtilTime.devuelveAnioActual(),cantidadHC);	
	}
	
	/**
	 * Metodo que genera el codigo para el detalle de una historia clinica
	 * */
	public String generaCodigoHCDetalle(String codigoHC){
		int cantidadArchivos = 0;
		try {
			HistoriaClinicaDAO historiaDAO	 		= new HistoriaClinicaDAO(conn);
			cantidadArchivos = historiaDAO.cuentaCantidadArchivosxHC(codigoHC);
		} catch (Exception e) {
		}
		return Utilitario.generaCodigoInsercionArchivoHC(codigoHC, cantidadArchivos);
	}
		
	public BResult buscarDiagnosticoPresuntivoHC(DynaBean dyna) throws BusinessException{
		BResult 				retSalida		= null;
		PacienteDAO				pacienteDAO		= null;
		try{
			conectar();
			pacienteDAO	 	= new PacienteDAO(conn);
			retSalida 		= pacienteDAO.buscarPacientexHC(Utilitario.getPropertyDynaBean(dyna, "dni"));
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarDiagnosticoPresuntivoHC generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarDiagnosticoPresuntivoHC generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
	
	public BResult buscarArchivoHC(DynaBean dyna) throws BusinessException{
		BResult 					retSalida		= null;
		DiagnosticoDefinitivoDAO	diagnosticoDAO		= null;
		try{
			conectar();
			diagnosticoDAO	 	= new DiagnosticoDefinitivoDAO(conn);
			retSalida 		= diagnosticoDAO.buscarDiagnosticoDefinitivo(Utilitario.getPropertyDynaBean(dyna, "dni"));
		}catch(Exception e){
			retSalida = new BResult();
			retSalida.setCode(ConstantesSECCD.ERROR_RET);
			retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarArchivoHC generado por:"+e.getMessage());
		}finally{
			try{
				desconectar();
			}catch(Exception e){
				retSalida = new BResult();
				retSalida.setCode(ConstantesSECCD.ERROR_RET);
				retSalida.setMessage("[HistoriaClinicaBO] error en metodo buscarArchivoHC generador po:"+e.getMessage());
			}
		}
		return retSalida;
	}
}
